package com.h3bpm.web.service;


import OThinker.H3.Controller.RestfulApi.cloudpivot.ResponseResult;
import OThinker.H3.Entity.Data.Attachment.Attachment;
import OThinker.H3.Entity.DataModel.BizObject;
import OThinker.H3.Entity.Instance.Data.InstanceData;
import com.alibaba.fastjson.JSONObject;
import data.DataException;

import java.util.Map;

public interface ContractService {


    /**
     * 生成合同编码
     * @param instanceId
     * @param userId
     * @return
     */
    ResponseResult contractCodeGenerate(String instanceId,String userId);


    /**
     * 合同订立成功,创建合同主数据
     * @param instanceData
     */
    int insetContractMasterData(InstanceData  instanceData) ;

    /**
     * 合同订立成功,创建合同主数据
     * @param instanceData
     */
    int insetSealRegistrationData(InstanceData  instanceData) ;

    /**
     * 获取合同会签人员
     * @param instanceId
     * @return
     */
    Object getCountersignedStaff(String instanceId);

    /**
     * 更新合同为已归档
     * @param objectId
     * @return
     */
    boolean updateContractToArchive(String objectId);

    /**
     * 更新合同模板状态
     * @param instanceId
     * @param status
     * @return
     */
    boolean updateContractTemplateStatus(String instanceId,String status);


    /**
     * 更新合同主数据流程为流程开始
     * @param objectId
     * @return
     */
    boolean updateWorkflowStatusToBegin(String objectId);

    /**
     * 更新合同主数据流程为流程结束
     * @param objectId
     * @return
     */
    boolean updateWorkflowStatusToEnd(String objectId);

    /**
     * 更新合同状态为执行中
     * @param instanceId
     * @return
     */
    boolean updateContractStatusToExecuting(String instanceId);

    /**
     * 变更合同编码生成
     * @param originalContractNumber
     * @return
     */
    boolean contractChangesCodeGenerate(String originalContractNumber)throws Exception;

    /**
     * 解除合同编码规则
     * @param originalContractNumber
     * @return
     * @throws Exception
     */
    boolean contractRelieveCodeGenerate(String originalContractNumber)throws Exception;
    /**
     * 插入变更合同到主数据
     * @param instanceId
     * @return
     */
    boolean insertChangesContractData(InstanceData instanceId)throws Exception;

    /**
     *插入变更用印数据
     * @param instanceId
     * @return
     */
    boolean insertChangesSealData(InstanceData instanceId) throws Exception;

    /**
     * 更改原合同数据为已变更合同
     * @param masterObjectId
     * @return
     */
    boolean updateContractChangesInfo(String masterObjectId) ;

    /**
     *更改原合同数据为作废合同
     * @param masterObjectId
     * @return
     */
    boolean updateContractStatusToNullify(String masterObjectId) ;


    /**
     * 修改合同状态为 终结(解除合同)
     * @param instanceId
     * @return
     */
    boolean updateContractStatusToTermination(String instanceId);


    /**
     * 修改合同状态为 终结(履行完毕)
     * @param contractNum
     * @return
     */
    boolean updateContractStatusToFulfilled(String contractNum);

    /**
     * 修改合同状态为 终结(履行完毕)
     * @param instanceId
     * @return
     */
    boolean updateOneContractStatusToFulfilled(String instanceId);
    /**
     *修改合同状态为中止状态
     * @param objectId
     * @return
     */
    boolean updateContractStatusToSuspend(String objectId);

    /**
     *  获取最终文件
     * @param instanceData
     * @param attachmentId
     * @return
     */
    Attachment generateFinalContract(InstanceData instanceData,String attachmentId) throws Exception;

    /**
     *  获取域替换的文件字节数组
     * @return
     */
    Attachment fieldReplace(BizObject biz,Attachment attachment) throws Exception;



    Map<String,Object> getContractByInstanceId(String instanceId,String code) throws Exception;

    void contractStatusUpdate(String instanceId,String status) throws  Exception;


    /**
     * 根据原始合同编号参数获取所有的附件
     * @param originalContractNum
     * @param userId
     * @param bizObjectId
     * @param bizObjectSchemaCode
     * @param dataField
     * @return
     * @throws Exception
     */
    Object getContractFile(String originalContractNum,String userId,String bizObjectId,String bizObjectSchemaCode,String dataField) throws Exception;



    boolean updatePerform(String contractNum,String timeOfPerformance,String totalActualPayment);
}
